docker buildを高速化!CodeBuildのローカルキャッシュ機能を試してみる
こんにちは、かたいなかです。
CodeBuildのローカルキャッシュ機能がリリースされました!
Improve Build Performance and Save Time Using Local Caching in AWS CodeBuild
S3の代わりにビルドを行うホスト上にキャッシュを保存できるようになり、S3への/からのキャッシュの転送時間なしにキャッシュが利用できるようになりました。
また、従来提供されていたbuildspec.yml
内で指定したファイルをキャッシュする機能に加え、DockerのイメージのレイヤのキャッシュやGitのメタデータのキャッシュも行えるようになりました。
個人的にもDockerのイメージのレイヤのキャッシュによるdocker build
やdocker pull
の高速化がとても良さそうに感じたので早速試してみました。
ローカルキャッシュ機能の概要
従来のCodeBuildのキャッシュ機能ではS3にキャッシュを保存する機能が提供されていましたが、それに加え、S3の代わりにビルドを行うホスト上にキャッシュを保存できるようになりました。ローカルキャッシュを使用することで、今までS3を利用したキャッシュを使用する際にかかっていたS3への/からのキャッシュの転送時間がかからなくなります。
また、ローカルキャッシュではDocker layer cache
とSource cache
のモードが提供されています。これにより、DockerのレイヤのキャッシュやGitのメタデータのキャッシュも行えるようになりました。従来のようなbuildspec.yml
で指定したディレクトリをキャッシュすることももちろん可能です。
キャッシュのモード
CodeBuildのローカルキャッシュでは以下の3種類のキャッシュを利用できます。
Docker layer cache
Dockerのイメージのレイヤをキャッシュします。これによりdocker build
やdocker pull
が高速に実行できます。
使用するにはCodeBuildで特権付与フラグを有効にしておく必要があります。
Source cache
Gitのメタデータをキャッシュし、差分のみをpullするようになります。これにより、巨大なモノリシックなリポジトリ等でのソースコードのpullの高速化が望めます。
Custom cache
buildspec.yml
で指定した特定のディレクトリ以下をキャッシュします。従来からのS3にキャッシュを保存する設定と同様の機能です。
例えば以下のようにbuildspec.yml
に記述すると/root/.m2/
以下のファイルがキャッシュされます。
cache: paths: - '/root/.m2/**/*'
ディレクトリ単位でのキャッシュのみで、特定のファイルに対してのキャッシュは行えません。
設定方法
プロジェクトの作成時にローカルキャッシュを設定する
CodeBuildのプロジェクト作成画面から設定するときはArtifacts
の設定のところから設定します。Cache type
としてLocal
を選択し、必要なキャッシュのモードを選択します。
既存のプロジェクトにローカルキャッシュを設定する
ローカルキャッシュの設定を行いたいプロジェクトの画面から編集
->Artifacts
とクリックし、編集画面に移動します。
そして、作成時に設定を行う場合と同様に、Cache type
としてLocal
を選択し、必要なキャッシュのモードを選択します。
DockerのLayer Cachingを試してみる
今回は以下のようなディレクトリ構成のプロジェクトを作成し、試してみます。
. ├── Dockerfile ├── buildspec.yml ├── package-lock.json ├── package.json └── src └── index.js
Dockerfile
は以下のようなNode.jsのアプリケーション用のものを使用しています。
FROM node:10-alpine ENV APP_ROOT /usr/src/app/ WORKDIR $APP_ROOT COPY package.json package-lock.json $APP_ROOT RUN npm install && npm cache clean --force COPY . $APP_ROOT EXPOSE 80 CMD ["node", "src/index.js"]
buildspec.yml
は以下のような内容にして、docker build
のみを行うように設定します。
version: 0.2 phases: build: commands: ## Dockerイメージのビルド - docker build . #custom cacheを使用する場合 #cache: # paths: # - directory_path/**/*
Docker layer cacheを有効にしたCodeBuildプロジェクトでキャッシュが効いていない状態で一度ビルドし、その後index.js
を修正した状態で再度ビルドしました。2回目のビルドではDockerfile
の8行目のRUN npm install && npm cache clean --force
までの処理がキャッシュされている想定です。
実際の結果は以下です。上側の2回目のビルドの時間がはっきり短くなっています。
2回目のビルドのログを見てみます。(docker build
の部分だけ抜粋)
Using cache
という文字列からわかるようにレイヤのキャッシュが利用されているのが確認できます。
まとめ
CodeBuildのローカルキャッシュを使用することで、DockerのイメージのLayerをキャッシュしたりGitリポジトリからのpullの高速化が行なえます。また、大量のファイルをキャッシュするときにもキャッシュの転送にかかる時間を気にする必要がなくなります。
個人的にもDockerのイメージのプルやビルドする際の高速化が望めるのはとても嬉しいです。
S3のバケットの用意も不要となり、設定もとても簡単ですのでCodeBuildを使用している際は設定してみてはいかがでしょうか。
参考
- Build Caching in CodeBuild
CodeBuildのドキュメントのキャッシュ機能に関するページです